/* 
闭包,ES6,ES7
*/

// for(var i = 0;i<5;i++) {
//     setTimeout(function() {
//         console.log(new Date,i)
//     },1000)
// }

// console.log(new Date,i)
//输出结果  5->5,5,5,5,5

//修改以上代码实现5-01234

// for(var i = 0;i<5;i++) {
//     (function(j) {
//         setTimeout(function() {
//             console.log(new Date,j)
//         },1000)
//     })(i)

// }

// console.log(new Date,i)

//巧用setTimeout的第三个参数
// for (var i = 0; i < 5; i++) {

//     setTimeout(function (i) {
//         console.log(new Date, i)
//     }, 1000,i)


// }

// console.log(new Date, i)

//js中按值传递
// function output(i) {
//     setTimeout(function() { 
//         console.log(new Date,i)
//     },1000)
// }

// for(var i = 0;i<5;i++) {
//     output(i)

// }

// console.log(new Date,i)

//需求:按照0-1-2-3-4-5来输出--最后一个输出在前五个执行完后,再间隔一秒执行.前面五个也是每隔一秒执行一次
//难点1: 循环中的要每隔一秒输出一次,之前的做法,五次大致会同时放进异步队列,这次要保证每隔一秒才往任务栈放一次
//难点2:要确保循环中的五个都执行完了,才去间隔一秒执行最后一行代码
//使用ES6中的promise,每一个promise里执行一个异步任务
/* 
小知识点:
    1.箭头函数 的函数体没有使用{} 可以表示return 的结果
    2.Array的push()不会返回一个数组
*/
// let tasks = []
// const output = (j)=> new Promise((resolve, reject) => {
//         setTimeout(function () {
//             console.log(new Date,j)
//             resolve(j)

//         }, 1000 * j) //这几个promise都是大致同一时间加入的,所以会计时执行,所以使用i*1000,每个任务间隔一秒
//     })


// for (var i = 0; i < 5; i++) {
//     // console.log(output(i))
//     tasks.push(output(i))

// }

// Promise.all(tasks).then(res => {
//     // console.log(res)
//     setTimeout(function () {
//         console.log(new Date,i)
//     }, 1000)
// })

//使用asyc和await完成需求
//  function sleep(time) {
//     return new Promise((resolve,reject)=> {
//         // console.log(new Date,time)
//         setTimeout(resolve,time)
//     })
// }

// async function aprint() {
//     for(var i = 0;i<5;i++) {
//         if (i > 0) {
//             await sleep(1000);
//         }
//         console.log(new Date, i);
//     }

//     await sleep(1000)
//     console.log(new Date,i)

// }

// aprint()

//测试await的执行
// function sleep(time) {
//    return new Promise(resolve =>setTimeout(resolve,time)) 
// }

// (async()=>{
//     console.log(new Date,1)
//     await sleep(1000)
//     console.log(new Date,2)
// })()

// function Person() {
//     this.a = 1
// }

// let p = new Person()
// console.log(p.prototype)


// let arr = [1,2,2,3,6,9]
// Array.prototype._forEach=function(foo) {
//     for(let i = 0;i<this.length;i++) {
//       foo.call(this,this[i],i) 
//     }
// }


// arr._forEach((item,index) =>{
//     console.log(item,index,this)
// })

const timeout = (ms) =>
  new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve();
    }, ms);
  });
const ajax1 = () =>
  timeout(2000).then(() => {
    console.log("1");
    return 1;
  });
const ajax2 = () =>
  timeout(1000).then(() => {
    console.log("2");
    return 2;
  });
const ajax3 = () =>
  timeout(2000).then(() => {
    console.log("3");
    return 3;
  });
  const mergePromise = (ajaxArray) => {
    return (async function () {
        let ret = []
        let idx = 0
        let len = ajaxArray.length
        while(idx < len) {
            let data = await ajaxArray[idx]()
            ret.push(data)
            idx++
        }
        console.log(ret)
        return ret
    })()
  }
let val = mergePromise([ajax1, ajax2, ajax3])
console.log(val)
val.then((data) => {
  console.log("done");
  console.log(data); // data 为[1,2,3]
});
// 执行结果为：1 2 3 done [1,2,3]
// es6 串行

  
